package com.jielihaofeng.nio.bytebuffer;

import java.nio.ByteBuffer;

import static com.jielihaofeng.nio.bytebuffer.ByteBufferUtil.debugAll;

/**
 * @description ByteBuffer练习
 * @author Johnnie Wind
 * @date 2021/10/10 14:42
 */
public class TestByteBufferExam {


    public static void main(String[] args) {
     /*
        网络上有多条数据发送给服务端，数据之间使用 \n 进行分隔
        但由于某种原因这些数据在接收时，被进行了重新组合，例如原始数据有3条为

        * Hello,world\n
        * I'm zhangsan\n
        * How are you?\n

        变成了下面的两个 byteBuffer (黏包，半包)

        * Hello,world\nI'm zhangsan\nHo
        * w are you?\n

        现在要求你编写程序，将错乱的数据恢复成原始的按 \n 分隔的数据
         */
        ByteBuffer source = ByteBuffer.allocate(32);
        source.put("Hello,World\nI'm zhangsan\nHo".getBytes());
        split(source);
        source.put("w are you?\n".getBytes());
        split(source);
    }

    /**
     * @description 这种解法有一点问题，时间复杂度很高，遍历找分隔符
     * @author Johnnie Wind
     * @date 2021/10/10 15:01
     * @Param [source]
     * @return void
     */
    private static void split(ByteBuffer source){
        source.flip();
        for (int i = 0; i < source.limit(); i++) {
            // 注意：\n 也是一个字节
            if (source.get(i) == '\n'){
                int length =  i + 1 - source.position();
                // 把完整消息存入新的ByteBuffer
                ByteBuffer target = ByteBuffer.allocate(length);
                // 从 source 读，向 target 写
                for (int j = 0; j < length; j++) {
                    target.put(source.get());
                }
                debugAll(target);
            }
        }

        source.compact();
    }


}
